# 位置不定长参数: 可以接收任意多个位置参数的参数类型,是形参的一种,在函数定义时使用
# 格式: 在函数的参数列表中使用*args
def func1(*args):
    print(args)


# 1. 传入多个实参,会打包为一个元组,保存在args中,理论上可以接收任意多个位置参数
func1(1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8)  # (1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8)

print('-----------------------------')
# 2. args 不能使用关键字参数形式进行赋值
# TypeError: func1() got an unexpected keyword argument 'args'
# func1(args=(1, 2, 3, 4, 5))

# 3. args就是一个形参名称,可以随意修改,只不过官方文档中用的就是这个名字,所以不建议修改
def func2(*apple):
    print(apple)


func1(1, 2, 3, 4)  # (1, 2, 3, 4)

print('-----------------------------')
# 4. *args可以和其他形参类型一起使用
def func3(*args, a, b, c=10):
    print(args)
    print(a)
    print(b)
    print(c)


# TypeError: func3() missing 2 required keyword-only arguments: 'a' and 'b'
# func3(1, 2, 3, 4, 5)
# 如果位置参数在args之后,则将只能通过关键字参数赋值的形式修改值的内容
func3(1, 2, 3, 4, 5, a=6, b=7)

print('-----------------------------')
# 所以在开发中,我们一般不会在位置参数之前使用不定长参数,建议顺序如下  位置参数, 位置不定长参数,缺省参数
def func4(a, b, *args, c=10):
    print(args)
    print(a)
    print(b)
    print(c)


func4(1, 2, 3, 4)


# 结论: 形参的顺序是: 位置参数  >>> 位置不定长参数 >>> 缺省参数(只能通过关键字参数进行赋值)
# print(self, *args, sep=' ', end='\n', file=None) 官方的参数顺序也是如此

print('-----------------------------')
# 练习
# 定义一个函数 ，计算任意多个数值的平均值。
def avg_nums(*args):
    return sum(args) / len(args)


print(avg_nums(1, 2, 3, 4, 6, 7, 3, 4))
